home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / ABC Hack / source / OldSaneNumerics.c next >
Text File  |  1996-06-21  |  3KB  |  140 lines

  1. #define OFFSET(type, field)                    ((int) &((type *) 0)->field)
  2. #define STACKOFFSET(type, A6field, field)    ((int) &((type *) 0)->field - (int) &((type *) 0)->A6field)
  3.  
  4. typedef struct IUStrData {
  5.     short    curChar;
  6.     short    mapChar;
  7.     short    decChar;
  8.     char    bufChar;
  9.     char    justAfter;
  10.     char    ignChar;
  11.     char    noFetch;
  12.     short    strCnt;
  13.     long    strPtr;
  14. } IUStrData;
  15.  
  16. typedef struct IUSortFrame {
  17.     short    firstRunLen;
  18.     short    flag;
  19.     char    pad[14];
  20.     char    weakMag;
  21.     char    msLock;
  22.     char    weakEq;
  23.     char    wantMag;
  24.     IUStrData    bInfo;
  25.     IUStrData    aInfo;
  26.     long    oldA6;
  27.     long    returnPtr;
  28.     short    bStrLen;
  29.     short    aStrLen;
  30.     long    bStrText;
  31.     long    aStrText;
  32. } IUSortFrame;
  33.  
  34. void Init (void);
  35. void Fetch (void);
  36. short RunLen (char *ptr, short remainingLen);
  37. unsigned short FixupSecondChar (IUSortFrame *sortFrame, char * remStrA, char * remStrB, short lenStrA, short lenStrB);
  38.  
  39. void main (void) {
  40.     asm {
  41.         bra        Init
  42.         bra        Fetch
  43.         dc.l    'NSrt'        // OSType identifier
  44.         dc.l    0            // OldInit            offset 8
  45.         dc.l    0            // OldFetch            offset 12
  46.         dc.l    0            // OldResourceSize    offset    16
  47.     }
  48. }
  49.  
  50. void Init (void) {
  51.     asm {
  52.         move.w    #0, STACKOFFSET(IUSortFrame, oldA6, flag) (a6);
  53.         
  54.         lea        main,a0
  55.         move.l    20(a0),d1
  56.         move.l    12(a0), d0
  57.         sub.l    d1,a0
  58.         add.l    d0,a0
  59.         jsr        (a0)
  60.     }
  61. }
  62.  
  63. void Fetch (void) {
  64.     asm {
  65.         tst.w    STACKOFFSET(IUSortFrame, oldA6, flag)(a6)
  66.         bne        @secondStr
  67.         
  68.         move.w    IUStrData.strCnt(a2), d0
  69.         add.w    #1,d0
  70.         move.w    d0, -(a7)
  71.         move.l    IUStrData.strPtr(a2), -(a7)
  72.  
  73.         lea        main,a0
  74.         move.l    20(a0),d1
  75.         move.l    16(a0), d0
  76.         sub.l    d1,a0
  77.         add.l    d0,a0
  78.         jsr        (a0)
  79.  
  80.         jsr        RunLen
  81.         add.l    #6,a7
  82.         
  83.         move.w    d0, STACKOFFSET(IUSortFrame, oldA6, firstRunLen) (a6)
  84.         move.w    #1, STACKOFFSET(IUSortFrame, oldA6, flag) (a6)
  85.         
  86.         @secondStr:
  87.         move.w    IUStrData.strCnt(a2), d0
  88.         add.w    #1,d0
  89.         move.w    d0, -(a7)
  90.         move.l    IUStrData.strPtr(a2), -(a7)
  91.         jsr        RunLen
  92.         add.l    #6,a7
  93.         
  94.         tst.w    d0
  95.         beq        @oldFetch
  96.         
  97.         tst.w    STACKOFFSET(IUSortFrame, oldA6, firstRunLen)(a6)
  98.         beq        @oldFetch
  99.         
  100.         cmp.w    STACKOFFSET(IUSortFrame, oldA6, firstRunLen)(a6), d0
  101.         beq        @oldFetch
  102.         
  103.         blt        @firstStrGreater
  104.         
  105.         move.w    #0xFF00, d4
  106.         rts
  107.         
  108.         @firstStrGreater:
  109.         
  110.         move.w    #0x0000, d4
  111.         rts
  112.         
  113.         @oldFetch:
  114.  
  115.         lea        main,a0
  116.         move.l    20(a0),d1
  117.         move.l    16(a0), d0
  118.         sub.l    d1,a0
  119.         add.l    d0,a0
  120.         jsr        (a0)
  121.  
  122.         rts
  123.     }
  124. }
  125.  
  126. short RunLen (char *ptr, short remainingLen) {
  127.     short runLen = 0;
  128.     while ((remainingLen > 0) && (*ptr >= '0') && (*ptr <= '9')) {
  129.         ++runLen;
  130.         ++ptr;
  131.         --remainingLen;
  132.     }
  133.  
  134.     return runLen;
  135. }
  136.  
  137. unsigned short FixupSecondChar (IUSortFrame *sortFrame, char * remStrA, char * remStrB, short lenStrA, short lenStrB) {
  138.  
  139.  
  140. }